#include <cstring>
#include "RPCSerialization.h"


 vector<uint8_t> RPCSerialization::serial() {
     vector<uint8_t> data;
     Uint32ToUint8 dataRes;
     dataRes.m_uint32 = m_arg_int0_;
     for(int i = 0; i < 4; ++i) {
        data.push_back(dataRes.m_uint8[i]);

     }

     dataRes.m_uint32 = m_arg_int1_;
     for(int i = 0; i < 4; ++i) {
        data.push_back(dataRes.m_uint8[i]);

     }

     dataRes.m_uint32 = m_length_;
     for(int i = 0; i < 4; ++i) {
        data.push_back(dataRes.m_uint8[i]);

     }
     for(int i = 0; i < m_length_; ++i) {
        data.push_back(m_strArgs_[i]);

     }
     return data;
 }

 void RPCSerialization::deserial(const vector<uint8_t>& data) {
    if(data.size() < 12) {
        return ;
    }
    Uint32ToUint8 dataRes;
    int idx = 0;
    // get arg_int0_ 0 1 2 3
    for(int i = 0; idx < 4; ++idx, ++i) {
        dataRes.m_uint8[i] = data[idx];
    }
    m_arg_int0_ = dataRes.m_uint32;
    // get arg_int1_ 4 5 6 7
    for(int i = 0; idx < 8; ++idx, ++i) {
        dataRes.m_uint8[i] = data[idx];
    }
    m_arg_int1_ = dataRes.m_uint32;
    // get m_length_ 8 9 10 11
    for(int i = 0; idx < 12; ++idx, ++i) {
        dataRes.m_uint8[i] = data[idx];
    }
    m_length_ = dataRes.m_uint32;
    m_strArgs_.clear();
    for(int i = 0; i < m_length_; ++i) {
        m_strArgs_.push_back(data[idx+i]);
    }
 }

 void RPCSerialization::setArgInt0(const uint32_t value) {
    m_arg_int0_ = value;
 }

 void RPCSerialization::setArgInt1(const uint32_t value) {
    m_arg_int1_ = value;
 }

 void RPCSerialization::setArgStr(const std::string& data, const size_t length) {
    m_strArgs_.clear();
    m_strArgs_.reserve(length);
    memcpy(m_strArgs_.data(), data.data(), length);
 }

 uint32_t RPCSerialization::getArgInt0( ) {
    return m_arg_int0_;
 }
 uint32_t RPCSerialization::getArgInt1( ) {
    return m_arg_int1_;
}
 uint32_t RPCSerialization::getLength( ) {
    return m_length_;
}

 std::string RPCSerialization::getArgStr() {
    return m_strArgs_;
}